package com.wang.friend.aspect;

import com.wang.common.security.exception.ServiceException;
import com.wang.friend.domain.user.vo.UserVO;
import com.wang.friend.manager.UserCacheManager;
import com.wang.common.core.constants.Constant;
import com.wang.common.core.enums.ResultCode;
import com.wang.common.core.utils.ThreadLocalUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 用户状态检查 切面类
 */
@Aspect
@Component
public class UserStatusCheckAspect {

    @Autowired
    private UserCacheManager userCacheManager;

    //(前置通知) 在方法执行前检查用户状态
    @Before("@annotation(com.wang.friend.aspect.CheckUserStatus)")
    public void before(JoinPoint joinPoint){
        //1.从当前线程中获取用户id
        Long userId = ThreadLocalUtil.get(Constant.USER_ID, Long.class);

        //2.根据id从缓存中查询出用户信息
        UserVO user = userCacheManager.getUserById(userId);
        if (user == null){
            //如果没找到用户,直接抛出异常
            throw new ServiceException(ResultCode.FAILED_USER_NOT_EXISTS);
        }

        //3.检查用户状态 (查看用户是否已经被封禁)
        if (user.getStatus().equals(Constant.FALSE)){
            throw new ServiceException(ResultCode.FAILED_USER_BANNED);
        }
    }
}
